Skip to content

Apache ActiveMQ Artemis

ActiveMQ 的下一代消息代理

安装

下载 2.19.1(支持 JDK 1.8 的版本)并解压

创建一个代理实例

代理实例是包含与代理流程关联的所有配置和运行时数据(如日志和消息日志)的目录。建议您不要在 ${ARTEMIS_HOME} 下创建实例目录。

在 Unix 系统上,通常将这种运行时数据存储在 /var/lib/ 目录下。例如,要在 /var/lib/mybroker/ 创建一个实例,请在命令行 shell 中执行以下命令:

sh
$ cd /var/lib
$ ${ARTEMIS_HOME}/bin/artemis create mybroker

一个代理实例目录将包含以下子目录:

  • bin:包含与此实例关联的执行脚本。
  • data:包含用于存储持久消息的数据文件。
  • etc:包含实例配置文件。
  • lib:包含任何自定义运行时 Java 依赖,如转换器、插件、拦截器等。
  • log:包含切割日志文件。
  • tmp:包含代理运行期间可以安全删除的临时文件。

启动和停止代理实例

假设你在 /var/lib/mybroker/ 下创建了代理实例,你需要做的就是开始运行代理实例:

sh
$ /var/lib/mybroker/bin/artemis run

要停止 Apache ActiveMQ Artemis 实例,您将使用相同的 Artemis 脚本,但带有 stop 参数。例子:

sh
$ /var/lib/mybroker/bin/artemis stop

Apache ActiveMQ Artemis 默认的控制台地址:http://localhost:8161/console

使用 spring-boot-starter-artemis

添加依赖:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-artemis</artifactId>
</dependency>

配置 Artemis 属性

properties
# 代理的 URL
spring.artemis.broker-url=tcp://localhost:61616

使用 JmsTemplate

  • 设置默认目的地

    properties
    # 默认目的地
    spring.jms.template.default-destination=hello-world

使用 JmsTemplate 发送消息

java
package study.helloworld.spring.jms.send;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

import study.helloworld.spring.jms.dto.MessageDTO;

@Component
public class Sender {

    @Autowired
    private JmsTemplate jmsTemplate;

    public void send(MessageDTO messageDTO) {
        // 使用默认目的地。手动使用 MessageCreator 来生成 Message 对象
        jmsTemplate.send(session -> session.createObjectMessage(messageDTO));

        // 指定目的地。自动使用 MessageConverter 将 Object 转换为 Message,默认情况下,将会使用
        // SimpleMessageConverter,需要被发送的对象实现 Serializable
        jmsTemplate.convertAndSend("world", messageDTO);

        // 指定目的地。设置消息的属性
        jmsTemplate.convertAndSend("study", messageDTO, message -> {
            message.setStringProperty("x_source", "web");
            return message;
        });
    }

}

使用 JmsTemplate 接收消息

主动拉取

java
package study.helloworld.spring.jms.receive;

import javax.jms.JMSException;
import javax.jms.Message;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

import study.helloworld.spring.jms.dto.MessageDTO;

@Component
public class Receiver {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(Receiver.class);

	@Autowired
	private JmsTemplate jmsTemplate;

	public void receive() {

		try {
			Message message = jmsTemplate.receive();
			MessageDTO messageDTO = message.getBody(MessageDTO.class);
			LOGGER.info("default destination messageDTO={}", messageDTO);
		} catch (JMSException e) {
			e.printStackTrace();
		}
		MessageDTO messageDTO = (MessageDTO) jmsTemplate
				.receiveAndConvert("world");
		LOGGER.info("world destination messageDTO={}", messageDTO);

		try {
			Message message = jmsTemplate.receive("study");
			String stringProperty = message.getStringProperty("x_source");
			LOGGER.info("study destination property x_source={}",
					stringProperty);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

被动监听

java
package study.helloworld.spring.jms.receive;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import study.helloworld.spring.jms.dto.MessageDTO;

@Component
public class MessageListener {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(MessageListener.class);

	@JmsListener(destination = "hello")
	public void receiveHello(MessageDTO messageDTO) {
		LOGGER.info("hello destination messageDTO={}", messageDTO);
	}

	@JmsListener(destination = "world")
	public void receiveWorld(MessageDTO messageDTO) {
		LOGGER.info("world destination messageDTO={}", messageDTO);
	}

	@JmsListener(destination = "study")
	public void receiveStudy(MessageDTO messageDTO) {
		LOGGER.info("study destination messageDTO={}", messageDTO);
	}

}

Released under the MIT License.